Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.02.2019, 18:04
Интересующийся
Отправить личное сообщение для spin Посмотреть профиль Найти все сообщения от spin
 
Регистрация: 14.10.2014
Сообщений: 11

onreadystatechange ведет себя не так как я ожидал
есть примерно такой код

function upload() {

  var resTxt = _id("uploadResult");
  var form   = _id("uploadForm");          
  var formdata = new FormData(form);
  var xhr      = new XMLHttpRequest();
  xhr.open("POST", "fileservlet");
  
  xhr.onreadystatechange = function() {
    console.log('readyState= ' + this.readyState);
    if (this.readyState == 2) {
      resTxt.innerHTML = "Uploading... ";
    }
    if (this.readyState == 3) {
      if(resTxt.innerHTML.length < 200)
        resTxt.innerHTML = resTxt.innerHTML + ".";
    }
    if (this.readyState == 4) {
      if(this.status != 200) {
        var msg = "ошибка: " + (this.status ? this.statusText : "запрос не удался");
        resTxt.innerHTML += msg;
      }
      else {
        resTxt.innerHTML += "Done";
      }
    }
  }
  
  xhr.send(formdata);
  
}


код работает, за одним исключением
я ожидаю что readyState == 2 будет сразу
потом сколько-то раз (больше одного) выдаст readyState == 3
и только в конце readyState == 4

но нет
все 2, 3, 4 выводит в конце
тестировал на файлах размером 1Гб
браузер FF 57

я чего-то не понимаю ?
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2019, 19:38
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от spin
я чего-то не понимаю ?
Если бы все было отправлено на сервер (получено с него) за мизерное время, тогда бы было раз и все, иначе данные могут отправляются частями, в которых клиент делает запросы и посылает заголовки, и сервер отвечает заголовками. То есть эти статусы за время передачи могут быть не один раз.

Если надо отследить загрузку, то используйте не прогрессбар.
Ответить с цитированием
  #3 (permalink)  
Старый 02.02.2019, 01:53
Интересующийся
Отправить личное сообщение для spin Посмотреть профиль Найти все сообщения от spin
 
Регистрация: 14.10.2014
Сообщений: 11

Сообщение от Rise
2, 3, 4 эти состояния относятся к ответу (response), а файл 1Гб у тебя как я понимаю из формы, значит это будет тело запроса (request).
ах вот оно как.
спасибо.

а как пользоваться xhr.upload ?
мне серверный код не придется переделывать ?
(в сервлете ожидается получение типичного multipart)
Ответить с цитированием
  #4 (permalink)  
Старый 03.02.2019, 01:59
Интересующийся
Отправить личное сообщение для spin Посмотреть профиль Найти все сообщения от spin
 
Регистрация: 14.10.2014
Сообщений: 11

Сообщение от Rise Посмотреть сообщение
Просто изначально было только одно readystatechange, а потом появились так называемые progress events, которые можно мониторить как на xhr так и на xhr.upload.
спасибо.

я правильно понимаю, что это не везде будет работать ?
в IE хоть каких-то версий это заработает ?

я бы хотел хотя бы IE 10
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать цитатник? WGN Общие вопросы Javascript 10 29.01.2017 01:39
TinyMCE странно себя ведет! Groz Общие вопросы Javascript 0 17.07.2014 22:27
Мотоциклисты есть? l-liava-l Оффтопик 13 04.07.2014 13:35
обясните плз почему мой SetInterval так странно себя ведет? Влад31/08/2000 Ваши сайты и скрипты 2 29.09.2013 17:14
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48